const Common = require ('./common');                        
// 引入公共方法 
const AdminModel = require ('../models/admin');      // 引入 admin表的model 
const Constant = require ('../constant/constant');      // 引入常量 
const dateFormat = require ('dateformat');                  
// 引入dateformat包 
const Token = require ('./token');                            
// 引入Token处理方法 
const TOKEN_EXPIRE_SENCOND = 3600;            // 设定默认Token的过 时 单位为的过期时间，单位为s 
// 配置对象 
let exportObj = {   login }; 
module.exports = exportObj;       // 导出对象，供其他模块调用 



 //登录方法 
function login (req, res) { 
  // 定义一个返回对象 
  const resObj = Common.clone (Constant.DEFAULT_SUCCESS); 
  // 定义一个async任务  
  let tasks = {     // 校验参数方法 
    checkParams: (cb) => { 
      // 调用公共方法中的校验参数方法，如果成功则继续后面的操作 
      // 如果失败则传递错误信息到async的最终方法中 
      Common.checkParams (req.body, ['username', 'password'], cb); 
    }, 
    // 查询方法 
    query: ['checkParams', (results, cb) => { 
      // 通过用户名和密码到数据库中查询 
      AdminModel 
        .findOne ({ 
          where: {             
            username: req.body.username,             
            password: req.body.password 
          } 
        }) 
        .then (function (result) {           // 查询结果处理 
          if(result){ 
            // 如果查询到了结果 
            // 组装数据，将查询结果组装到成功返回的数据中             
            resObj.data = {               
                id: result.id,               
                username: result.username,               
                name: result.name,               
                role: result.role,               
                lastLoginAt: dateFormat (result.lastLoginAt, 'yyyy-mm-dd HH:MM:ss'), 
              createdAt: dateFormat (result.createdAt, 'yyyymm-dd HH:MM:ss') 
            }; 
            // 将admin的id保存在Token中             
            const adminInfo = {               
                id: result.id             
            };             // 生成Token 
            let token = Token.encrypt(adminInfo, TOKEN_EXPIRE_SENCOND); 
            resObj.data.token = token;      // 将Token保存在返回对象中，返回前端 
            cb (null, result.id);                  // 继续后续操作，传递admin的id参数 
          }else{ 
            // 没有查询到结果，传递错误信息到async的最终方法 
            cb (Constant.LOGIN_ERROR); 
          } 
        }) 
        .catch (function (err) {           // 错误处理 
          console.log (err);                        // 打印错误日志 
          cb (Constant.DEFAULT_ERROR);      // 传递错误信息到 async的最终方法中 
        });     
    }],
    // 写入上次登录日期 
    writeLastLoginAt: ['query', (results, cb) => {       
        let adminId = results['query'];      // 获取前面传递过来的参数admin的id 
      // 通过id查询，将当前时间更新为数据库中的上次登录时间 
      AdminModel         
      .update ({ 
          lastLoginAt: new Date() 
        }, {           
            where: {             
                id: adminId 
          } 
        }) 
        .then (function (result) {           // 更新结果处理           
        if(result){ 
            cb (null);                              // 如果更新成功，就继续后续操作 
          }else{ 
            // 如果更新失败，就传递错误信息到async最终方法 
            cb (Constant.DEFAULT_ERROR); 
          } 
        }) 
        .catch (function (err) { 
          // 错误处理 
          console.log (err);                        // 打印错误日志 
          cb (Constant.DEFAULT_ERROR);      // 传递错误信息到 async的最终方法中 
        }); 
    }] 
  }; 
  Common.autoFn (tasks, res, resObj)      // 执行公共方法中的 autoFn方法，返回数据
}